package aliyun

//
// // @doc https://help.aliyun.com/document_detail/330834.html?spm=a2c4g.11186623.0.0.14cd2609UPy9PX
//
// // videoDetection 视频审核
// type videoDetection struct {
// 	scenes      []string       // 场景
// 	callbackUrl string         // 回调地址
// 	asyncReq    *videoAsyncReq // 异步检测
// }
//
// // ==================  异步任务  =====================
//
// // videoAsyncReq 异步任务请求参数
// type videoAsyncReq struct {
// 	BizType *string `json:"bizType,omitempty"` // 该字段用于标识您的业务场景。
// 	// 是否直播。取值：
// 	// false（默认）：表示点播视频检测。
// 	// true：表示直播流检测。
// 	Live *bool `json:"live,omitempty"`
// 	// 是否近线检测模式。
// 	// false（默认）：表示实时检测模式，对于超过了并发路数限制的检测请求会直接拒绝。
// 	// true：表示近线检测模式，提交的任务不保证实时处理，但是可以排队处理，在24小时内开始检测。
// 	Offline *bool `json:"offline,omitempty"`
// 	// 指定视频检测场景。取值：
// 	// porn：视频智能鉴黄。
// 	// terrorism：视频暴恐涉政。
// 	// live：视频不良场景。
// 	// logo：视频logo。
// 	// ad：视频图文违规。
// 	Scenes []string `json:"scenes"`
// 	// 指定视频语音检测场景，唯一取值：antispam，表示语音反垃圾。
// 	// 不传入该参数时仅检测视频图像内容；如果传入该参数，则在检测视频中图像的同时，对视频中语音进行检测。
// 	AudioScenes []*string `json:"audioScenes,omitempty"`
// 	// 检测结果回调通知您的URL，支持使用HTTP和HTTPS协议的地址。该字段为空时，您必须定时轮询检测结果。
// 	// callback接口必须支持POST方法、UTF-8编码的传输数据，以及表单参数checksum和content。内容安全按照以下规则和格式设置checksum和content，调用您的callback接口返回检测结果。
// 	Callback *string `json:"callback,omitempty"`
// 	// 随机字符串，该值用于回调通知请求中的签名。
// 	// 由英文字母、数字、下划线（_）组成，不超过64个字符。由您自定义，用于在接收到内容安全的回调通知时校验请求由阿里云内容安全服务发起。
// 	Seed *string `json:"seed,omitempty"`
// 	// 使用回调通知时（callback），设置对回调通知内容进行加密的算法。内容安全会将返回结果（由用户uid + seed + content拼接的字符串）按照您设置的加密算法加密后，再发送到您的回调通知地址。取值：
// 	// SHA256（默认）：使用SHA256加密算法。
// 	// SM3：使用国密HMAC-SM3加密算法，返回十六进制的字符串，且字符串由小写字母和数字组成。
// 	// 例如，abc经国密SM3加密后返回66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0。
// 	CryptType *string           `json:"cryptType,omitempty"`
// 	Tasks     []*videoAsyncTask `json:"tasks"` // 指定检测对象，JSON数组中的每个元素是一个检测任务结构体。最多支持100个元素，即每次提交100条内容进行检测，支持100个元素的前提是需要将并发任务调整到100个以上。
// }
//
// type videoAsyncTask struct {
// 	ClientInfo interface{} `json:"clientInfo,omitempty"` // 客户端信息
// 	// 检测对象对应的数据ID。
// 	// 由大小写英文字母、数字、下划线（_）、短划线（-）、英文句号（.）组成，不超过128个字符，可以用于唯一标识您的业务数据。
// 	DataId *string `json:"dataId,omitempty"`
// 	// 视频直播流的ID。
// 	// 该参数用于视频直播任务去重，防止重复检测，如果传递该参数，会根据uid+bizType+liveId判断是否存在检测中的直播任务。如果存在，就直接返回已存在的直播检测taskId，不发起新的任务。
// 	LiveId *string `json:"liveId,omitempty"`
// 	// 检测对象的URL。
// 	// 公网HTTP/HTTPS URL，且长度不超过2048个字符。
// 	// 阿里云OSS提供的文件路径。您需要先授权内容安全访问OSS存储空间，仅限相同区域的OSS空间。更多信息，请参见授权内容安全访问OSS存储空间。
// 	// 文件路径格式：oss://<bucket-name>.<endpoint>/<object-name>
// 	Url         *string                `json:"url,omitempty"`
// 	Frames      []*VideoAsyncTaskFrame `json:"frames,omitempty"`      // 待检测视频的截帧信息
// 	FramePrefix *string                `json:"framePrefix,omitempty"` // 截帧地址的前缀，与frame.url一起组成截帧的完整地址。视频截帧的完整地址格式为framePrefix + frame.url
// 	Interval    *uint                  `json:"interval,omitempty"`    // 视频截帧间隔，单位为秒，取值范围：1~600。默认值为1秒
// 	MaxFrames   *uint                  `json:"maxFrames,omitempty"`   // 系统对本次检测的视频进行截帧的张数上限，取值范围：5~3600，默认为200张
// }
//
// type VideoAsyncTaskFrame struct {
// 	Url    *string `json:"url,omitempty"`    // 视频截帧的URL，与framePrefix一起组成截帧的完整地址。视频截帧的完整地址格式为framePrefix + frame.url
// 	Offset *uint   `json:"offset,omitempty"` // 截帧距离片头的时间戳，单位为秒
// }
//
// // videoAsyncResp 异步检测响应
// type videoAsyncResp struct {
// 	yunDunResp
// 	Data []*videoAsyncRespData `json:"data"`
// }
//
// // VideoAsyncAuditCallbackReq 回调参数
// type VideoAsyncAuditCallbackReq struct {
// 	yunDunBase
// 	DataId string `json:"dataId"`
// 	Extras *struct {
// 		FrameCount  string `json:"frameCount"`
// 		FramePrefix string `json:"framePrefix"`
// 	} `json:"extras,omitempty"`
// 	Results []*struct {
// 		Label      string  `json:"label"`
// 		Rate       float64 `json:"rate"`
// 		Scene      string  `json:"scene"`
// 		Suggestion string  `json:"suggestion"`
// 	} `json:"results,omitempty"`
// 	TaskId string `json:"taskId"`
// 	Url    string `json:"url"`
// }
//
// // videoAsyncRespData 异步检测响应数据
// type videoAsyncRespData struct {
// 	TaskId string `json:"taskId"` // 检测对象对应的任务ID
// 	DataId string `json:"dataId"` // 检测对象对应的数据ID
// }
//
// // videoCallbackHookFunc 回调函数
// type videoCallbackHookFunc func(r *ghttp.Request, paramsReq *VideoAsyncAuditCallbackReq)
//
// var videoCallback videoCallbackHookFunc
//
// // RegisterCallbackHook 回调注册(简单观察者)
// func (*videoDetection) RegisterCallbackHook(fn videoCallbackHookFunc) {
// 	videoCallback = fn
// }
//
// // callback 异步回调
// func (*videoDetection) callback(r *ghttp.Request) {
// 	var paramsReq *VideoAsyncAuditCallbackReq
// 	if err := gjson.DecodeTo(r.Request.FormValue("content"), &paramsReq); err != nil {
// 		net.NewResponse(r).ResponseBadRequest(err.Error())
// 	}
// 	if videoCallback != nil {
// 		go videoCallback(r, paramsReq)
// 	}
// 	net.NewResponse(r).ResponseOk()
// }
//
// // CreateAsyncReq 创建请求
// func (r *videoDetection) CreateAsyncReq() *videoAsyncReq {
// 	r.asyncReq = &videoAsyncReq{}
// 	r.asyncReq.Scenes = r.scenes
// 	r.asyncReq.Callback = &r.callbackUrl
// 	return r.asyncReq
// }
//
// // SetSeed 设置Seed
// func (r *videoAsyncReq) SetSeed(seed *string) *videoAsyncReq {
// 	r.Seed = seed
// 	return r
// }
//
// // AddTask 追加任务
// func (r *videoAsyncReq) AddTask(dataId, url *string, interval, maxFrames *uint) *videoAsyncReq {
// 	r.Tasks = append(r.Tasks, &videoAsyncTask{
// 		ClientInfo:  nil,
// 		DataId:      dataId,
// 		LiveId:      nil,
// 		Url:         url,
// 		Frames:      nil,
// 		FramePrefix: nil,
// 		Interval:    interval,
// 		MaxFrames:   maxFrames,
// 	})
// 	return r
// }
//
// // ... 其他参数按需添加
//
// // Scan 异步检测
// func (r *videoAsyncReq) Scan() (*videoAsyncResp, error) {
// 	if r == nil {
// 		return nil, errors.New(errMsgYunDunClientUninitialized)
// 	}
//
// 	// 简单参数校验
// 	{
// 		// task校验
// 		if len(r.Tasks) == 0 {
// 			return nil, errors.New(errMsgYunDunNoTaskAdd)
// 		}
//
// 	}
//
// 	// 获取句柄
// 	client, err := ContentModeration.getInstance()
// 	if client == nil {
// 		return nil, err
// 	}
//
// 	// 创建
// 	request := green.CreateVideoAsyncScanRequest()
// 	{
// 		bs, err := gjson.Encode(*r)
// 		if err != nil {
// 			return nil, err
// 		}
// 		request.SetContent(bs)
// 	}
//
// 	// 发起
// 	if response, _err := client.VideoAsyncScan(request); _err != nil {
// 		return nil, _err
// 	} else {
// 		// 网络请求失败
// 		if response.GetHttpStatus() != 200 {
// 			return nil, errors.New(http.StatusText(response.GetHttpStatus()))
// 		}
// 		// 转换
// 		var paramsResp *videoAsyncResp
// 		if err := gconv.Scan(response.GetHttpContentBytes(), &paramsResp); err != nil {
// 			return nil, err
// 		}
// 		return paramsResp, nil
// 	}
// }
